package com.youdianstar.app.util;


import com.youdianstar.app.common.util.MathUtil;

/**
 * File: LatLngUtils
 * author: yu Create on 2020/3/2 15:14
 * Change (from 2020/3/2)
 * --------------------------------
 * description:
 * ----------------------------
 */
public class LatLngUtil {

    //地球半径 : 平均 6371; 最大-6378.137
    private static final double EARTH_RADIUS = 6371;// 单位千米

    /**
     * 角度弧度计算公式 rad:(). <br/>
     *
     * 360度=2π π=Math.PI
     *
     * x度 = x*π/360 弧度
     *
     * @author chiwei
     * @param degree
     */
    private static double getRadian(double degree) {
        return degree * Math.PI / 180.0;
    }

    private static double round(double d) {
        return Math.floor(d + 0.5);
    }


    /**
     * 依据经纬度计算两点之间的距离
     *
     *
     * @param lat1 1点的纬度
     * @param lng1 1点的经度
     * @param lat2  2点的纬度
     * @param lng2  2点的经度
     *
     * @return 距离 单位 km
     * @since JDK 1.6
     */
    public static double getDistance(double lat1, double lng1, double lat2, double lng2) {
        double radLat1 = getRadian(lat1);
        double radLat2 = getRadian(lat2);
        // 两点纬度差
        double a = radLat1 - radLat2;
        // 两点的经度差
        double b = getRadian(lng1) - getRadian(lng2);
        double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) +
                Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2), 2)));
        s = s * EARTH_RADIUS;
        return s;
    }

    /**
     * 依据经纬度计算两点之间的距离
     *
     *
     * @param lat1 1点的纬度
     * @param lng1 1点的经度
     * @param lat2  2点的纬度
     * @param lng2  2点的经度
     *
     * @return 距离 单位 km
     * @since JDK 1.6
     */
    public static double getDistance2(double lat1, double lng1, double lat2, double lng2) {
        double radLat1 = Math.toRadians(lat1);
        double radLat2 = Math.toRadians(lat2);
        // 两点纬度差
        double a = radLat1 - radLat2;
        // 两点的经度差
        double b = Math.toRadians(lng1) - Math.toRadians(lng2);
        double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) +
                Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2), 2)));
        s = s * EARTH_RADIUS;
        return s;
    }


    /**
     * 获取距离
     *
     * @param lat1 纬度1
     * @param lng1 经度1
     * @return 小于1km->使用m ;
     */
    public static String getDistanceStr(double lat1, double lng1, double lat2, double lng2) {
        if (lat1 ==0 && lng1 ==0){
            return ""; //经纬度 起始不能为0
        }
        double sKm = getDistance(lat1,lng1,lat2,lng2);
        if (sKm>=1){
            return MathUtil.round(sKm) +" km"; //两位小数
        }
        return ((int)Math.round(sKm * 1000))+" m";
    }

    /**
     * 获取距离 - 公里（km）
     *
     * @param lat1 纬度1
     * @param lng1 经度1
     * @return 小于1km->使用m ;
     */
    public static String getDistanceMiTx(double lat1, double lng1, double lat2, double lng2) {
        if (lat1 ==0 && lng1 ==0){
            return ""; //经纬度 起始不能为0
        }
        double sKm = getDistance(lat1,lng1,lat2,lng2);
        if (sKm>=1){
            return MathUtil.round(sKm) +" km"; //两位小数
        }
        return ((int)Math.round(sKm * 1000))+" m";
    }

    // 米换算成英里的方法
    private static double metersToMiles(double meters) {
        // 1英里 = 1609.344米
        return meters / 1609.344;
    }

    // 千米换算成英里的方法
    private static double kilometersToMiles(double kilometers) {
        // 1英里 = 1.609344千米
        return kilometers / 1.609344;
    }
}

